// 判断属性是否是对象自有的

const p = {
    kind: '禽类',
    fly(){
        console.log(`${this.kind}动物大都是可以飞的`);
    }
}

const x = Object.create(p, {
    // propertyName: propertyDescriptor
    name: { value: '凤', enumerable: true },
    gender: { value: '雄', enumerable: false }
});

// 调用从 Object.prototype 继承的 hasOwnProperty 方法判断指定属性是否是自有的
console.log( x.hasOwnProperty( 'kind' ) ); // false
console.log( x.hasOwnProperty( 'fly' ) ); // false
console.log( x.hasOwnProperty( 'name' ) ); // true
console.log( x.hasOwnProperty( 'gender' ) ); // true

// 动态为 x 指向实例添加了一个名称为 hasOwnProperty 属性
x.hasOwnProperty = function(){
    return true;
}

// 调用 x 指向的实例自有的 hasOwnProperty 已经没有意义了
console.log( x.hasOwnProperty( 'kind' ) ); // true
console.log( x.hasOwnProperty( 'fly' ) ); // true
console.log( x.hasOwnProperty( 'name' ) ); // true
console.log( x.hasOwnProperty( 'gender' ) ); // true

// 为了替代 hasOwnProperty 所以在 ECMA Script 2022 中新增了 hasOwn 方法
console.log( Object.hasOwn(x, 'kind') );
console.log( Object.hasOwn(x, 'fly') );
console.log( Object.hasOwn(x, 'name') );
console.log( Object.hasOwn(x, 'gender') );

// Object.hasOwn(instance, property)
// 作用: 判断指定属性(property)是否是指定对象(instance)自有属性
// 返回: 仅当指定属性是指定对象自有属性时返回 true
// 参考文档:
// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn